package com.ruoyi.basebill.service.impl.billIssue;

import com.ruoyi.basebill.domain.*;
import com.ruoyi.basebill.mapper.TWfzRemunerationMapper;
import com.ruoyi.basebill.service.billIssue.ISbftService;
import com.ruoyi.basebill.service.impl.WfzSbftServiceImpl;
import com.ruoyi.basebill.service.impl.billIssue.util.BillIssueUtil;
import com.ruoyi.basebill.service.impl.billIssue.util.Jsfs;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

@Service
public class SbftService implements ISbftService {

    @Autowired
    private TWfzRemunerationMapper tWfzRemunerationMapper;

    @Autowired
    private BillIssueUtil billIssueUtil;

    @Autowired
    private WfzSbftServiceImpl wfzSbftService;




    @Override
    public int billIssue(Long billId) {
        WfzSbft wfzSbft = new WfzSbft();
        //首先根据传入的单据id，查找对应的数据
        TWfzRemuneration tWfzRemuneration = tWfzRemunerationMapper.selectTWfzRemunerationByFid(billId);
        //获取薪酬总表的单据头信息
        String fcompany = tWfzRemuneration.getFcompany();//组织
        String fperiod = tWfzRemuneration.getFperiod();//薪酬期间
        //获取当前登录的用户
        LoginUser loginUser = SecurityUtils.getLoginUser();
        String username = loginUser.getUsername();

        //总人数就是薪酬总表里所有的人  合并纳税成本中心就是属性是同组织下合并纳税成本中心的人数 关联方就是非同组织和同组织下二级组织属性的
        //总人数
        BigDecimal zrs = BigDecimal.valueOf(tWfzRemuneration.getTWfzRemunerationentryList().size());
        //合并纳税成本中心人数
        int nscbzxrs = 0;
        //关联方人数
        int glf = 0;

        // 准备一个map，用来存储不同成本中心所对应的分录数据
        HashMap<String, List<TWfzRemunerationentry>> map1 = new HashMap<>();
        //开始遍历薪酬总表的分录信息
        List<TWfzRemunerationentry> tWfzRemunerationentryList = tWfzRemuneration.getTWfzRemunerationentryList();
        for (TWfzRemunerationentry tWfzRemunerationentry : tWfzRemunerationentryList) {
            String fcostnumber = tWfzRemunerationentry.getFcostnumber();
            if (map1.containsKey(fcostnumber)){
                map1.get(fcostnumber).add(tWfzRemunerationentry);
            }else {
                ArrayList<TWfzRemunerationentry> objects = new ArrayList<>();
                objects.add(tWfzRemunerationentry);
                map1.put(fcostnumber,objects);
            }
        }
        //循环结束，对应的数据，根据成本中心进行划分。
        //开始根据离职状态进行整合，以及将社保实际数录入的数据进行整合，得出所有的社保缴纳数据
        ArrayList<WfzSbftentry> wfzSbftentries = new ArrayList<>();

        for (String s : map1.keySet()) {
            //准备一个map，用来存储不同离职状态的数据。
            HashMap<Long, List<TWfzRemunerationentry>> map2 = new HashMap<>();
            List<TWfzRemunerationentry> tWfzRemunerationentries = map1.get(s);
            for (TWfzRemunerationentry tWfzRemunerationentry : tWfzRemunerationentries) {
                Long fislz = tWfzRemunerationentry.getFislz();
                if (map2.containsKey(fislz)){
                    map2.get(fislz).add(tWfzRemunerationentry);
                }else {
                    ArrayList<TWfzRemunerationentry> objects = new ArrayList<>();
                    objects.add(tWfzRemunerationentry);
                    map2.put(fislz,objects);
                }
            }
            //循环结束，离职状态也进行划分
            //获取公用的数据
            TWfzRemunerationentry tWfzRemunerationentry1 = map1.get(s).get(0);
            String gynumber = tWfzRemunerationentry1.getFcostnumber();
            String fcostnumber = billIssueUtil.costNumber(gynumber);//成本中心编码
            String fcostname = tWfzRemunerationentry1.getFcostname();//成本中心名称
            /*成本中心所属财务组织字段数据获取方式待定*/
            String fcostcompany = tWfzRemunerationentry1.getFcostcompany();//成本中心所属财务组织
            String jsfs = billIssueUtil.Jsfs(Jsfs.SB,fcompany, tWfzRemunerationentry1.getFpersonnumber());//组织间结算方式
            String costType = billIssueUtil.costType(gynumber);//成本中心属性
            Long isdysb = billIssueUtil.getIsdysb(gynumber);//是否当月缴纳
            String fvourtype = tWfzRemunerationentry1.getFvourtype();//凭证字

            if ("同组织下合并纳税成本中心".equals(jsfs)){
                nscbzxrs += map1.get(s).size();
            }
            if ("同组织下是二级组织".equals(jsfs) || "非同组织".equals(jsfs)){
                glf += map1.get(s).size();
            }


            //开始循环区分好的薪酬总表-工资发放分录
            for (Long aLong : map2.keySet()) {
                WfzSbftentry wfzSbftentry = new WfzSbftentry();
                //对其中需要进行计算的属性进行初始化
                wfzSbftentry.setFylbx(new BigDecimal(0));
                wfzSbftentry.setFyybx(new BigDecimal(0));
                wfzSbftentry.setFsybx(new BigDecimal(0));
                wfzSbftentry.setFssbx(new BigDecimal(0));
                wfzSbftentry.setFgsbx(new BigDecimal(0));
                wfzSbftentry.setFgryl(new BigDecimal(0));
                wfzSbftentry.setFgryy(new BigDecimal(0));
                wfzSbftentry.setFgrsy(new BigDecimal(0));

                for (TWfzRemunerationentry tWfzRemunerationentry : map2.get(aLong)){
                    wfzSbftentry.setFylbx(wfzSbftentry.getFylbx().add(tWfzRemunerationentry.getFylbx()));//养老保险
                    wfzSbftentry.setFyybx(wfzSbftentry.getFyybx().add(tWfzRemunerationentry.getFyybx()));//医疗保险
                    wfzSbftentry.setFsybx(wfzSbftentry.getFsybx().add(tWfzRemunerationentry.getFsyubx()));//生育保险
                    wfzSbftentry.setFssbx(wfzSbftentry.getFssbx().add(tWfzRemunerationentry.getFsybx()));//失业保险
                    wfzSbftentry.setFgsbx(wfzSbftentry.getFgsbx().add(tWfzRemunerationentry.getFgsbx()));//工伤保险
                    wfzSbftentry.setFgryl(wfzSbftentry.getFgryl().add(tWfzRemunerationentry.getFgryl()));//个人养老
                    wfzSbftentry.setFgryy(wfzSbftentry.getFgryy().add(tWfzRemunerationentry.getFgryy()));//个人医疗
                    wfzSbftentry.setFgrsy(wfzSbftentry.getFgrsy().add(tWfzRemunerationentry.getFgrsy()));//个人失业
                }
                wfzSbftentry.setFcostnumber(fcostnumber);//成本中心编码
                wfzSbftentry.setFcostname(fcostname);//成本中心名称
                wfzSbftentry.setFcostcompany(fcostcompany);//成本中心所属财务组织
                wfzSbftentry.setFjsfs(jsfs);//组织间结算方式
                wfzSbftentry.setFcbzxxz(costType);//成本中心属性
                wfzSbftentry.setFisdy(isdysb);//是否当月缴纳
                wfzSbftentry.setFvourtype(fvourtype);//凭证字
                Long fislz = map2.get(aLong).get(0).getFislz();
                wfzSbftentry.setFislz(fislz);//是否离职员工

                //差额部分暂时不做处理

                //将处理好的社保缴纳分录数据加入到分录中
                wfzSbftentries.add(wfzSbftentry);

            }

        }

        //开始获取单据头数据
        billIssueUtil.setBillNumber(wfzSbft);//设置单据编号
        String company = billIssueUtil.costNumber(fcompany);
        wfzSbft.setFcompany(company);//组织
        wfzSbft.setFperiod(fperiod);//薪酬期间
        wfzSbft.setFzrs(zrs);//总人数
        wfzSbft.setFnscbzxrs(BigDecimal.valueOf(nscbzxrs));//合并纳税成本中心人数
        wfzSbft.setFglf(BigDecimal.valueOf(glf));//关联方人数
        String vourtype = billIssueUtil.getPzz(fcompany);
        wfzSbft.setFvourtype(vourtype);//凭证字
        wfzSbft.setFcreator(username);//制单人
        wfzSbft.setFcreatetime(new Date());//制单时间
        wfzSbft.setFlastupdateuser(username);//最后修改人
        wfzSbft.setFlastupdatetime(new Date());//最后修改时间
        wfzSbft.setFstate("SAVE");//单据状态
        wfzSbft.setFsourcebillid(String.valueOf(billId));//来源单ID
        wfzSbft.setFiseas(0l);//是否同步至eas
        wfzSbft.setWfzSbftentryList(wfzSbftentries);//设置社保分摊分录数据


//        //开始遍历薪酬总表的分录信息
//        List<TWfzRemunerationentry> tWfzRemunerationentryList = tWfzRemuneration.getTWfzRemunerationentryList();
//        if (tWfzRemunerationentryList != null && tWfzRemunerationentryList.size() >0){
//            for (int i = 0; i < tWfzRemunerationentryList.size(); i++) {
//                TWfzRemunerationentry tWfzRemunerationentry = tWfzRemunerationentryList.get(i);
//                String fcostnumber = tWfzRemunerationentry.getFcostnumber();//成本中心
//                String fcostname = tWfzRemunerationentry.getFcostname();//成本中心名称
//                String fcostcompany = tWfzRemunerationentry.getFcostcompany();//成本中心所属财务组织
//                BigDecimal fylbx = tWfzRemunerationentry.getFylbx();//养老保险
//                BigDecimal fyybx = tWfzRemunerationentry.getFyybx();//医疗保险
//                BigDecimal fsybx = tWfzRemunerationentry.getFsybx();//失业保险
//                BigDecimal fgsbx = tWfzRemunerationentry.getFgsbx();//工伤保险
//                BigDecimal fgryl = tWfzRemunerationentry.getFgryl();//个人养老
//                BigDecimal fgryy = tWfzRemunerationentry.getFgryy();//个人医疗
//                BigDecimal fgrsy = tWfzRemunerationentry.getFgrsy();//个人失业
//
//                String fvourtype = tWfzRemunerationentry.getFvourtype();//凭证字
//                Long fissbdy = tWfzRemunerationentry.getFissbdy();//是否当月发放
//                Long fislz = tWfzRemunerationentry.getFislz();//是否离职
//
//                WfzSbftentry wfzSbftentry = new WfzSbftentry();
//                wfzSbftentry.setFcostnumber(fcostnumber);//成本中心
//                wfzSbftentry.setFcostname(fcostname);//成本中心名称
//                wfzSbftentry.setFcostcompany(fcostcompany);//成本中心所属财务组织
//                wfzSbftentry.setFylbx(fylbx);//养老保险
//                wfzSbftentry.setFyybx(fyybx);//医疗保险
//                //缺少数据，生育保险
//                wfzSbftentry.setFssbx(fsybx);//失业保险
//                wfzSbftentry.setFgsbx(fgsbx);//工伤保险
//                wfzSbftentry.setFgryl(fgryl);//个人养老
//                wfzSbftentry.setFgryy(fgryy);//个人医疗
//                wfzSbftentry.setFgrsy(fgrsy);//个人失业
//                //缺少数据，养老保险差额
//                //缺少数据，医疗保险差额
//                //缺少数据，生育保险差额
//                //缺少数据，失业保险差额
//                //缺少数据，工伤保险差额
//
//                //获取分录的结算方式
//                String jsfs = billIssueUtil.Jsfs(fcompany, fcostnumber);
//                wfzSbftentry.setFjsfs(jsfs);//组织间结算方式
//
//                //成本中心属性：
//                String costType = billIssueUtil.costType(fcostnumber);
//                wfzSbftentry.setFcbzxxz(costType);//成本中心属性
//
//                wfzSbftentry.setFisdy(0l);//是否当月发放
//                wfzSbftentry.setFislz(fislz);//是否离职
//                wfzSbftentry.setFvourtype(fvourtype);//凭证字
//
//                wfzSbftentries.add(wfzSbftentry);//新增到单据分录
//            }
//        }
//        //总人数就是薪酬总表里所有的人  合并纳税成本中心就是属性是同组织下合并纳税成本中心的人数 关联方就是非同组织和同组织下二级组织属性的
//        //总人数
//        BigDecimal zrs = BigDecimal.valueOf(wfzSbftentries.size());
//        //合并纳税成本中心人数
//        int nscbzxrs = 0;
//        //关联方人数
//        int glf = 0;
//        for (int i = 0; i < wfzSbftentries.size(); i++) {
//            WfzSbftentry wfzSbftentry = wfzSbftentries.get(i);
//            String fjsfs = wfzSbftentry.getFjsfs();
//            if ("同组织下合并纳税成本中心".equals(fjsfs)){
//                nscbzxrs++;
//            }
//            if ("同组织下是二级组织".equals(fjsfs) || "非同组织".equals(fjsfs)){
//                glf++;
//            }
//        }
//
//        //开始赋值
//
//        billIssueUtil.setBillNumber(wfzSbft);
//        wfzSbft.setFcompany(billIssueUtil.costNumber(fcompany));//组织
//        wfzSbft.setFperiod(fperiod);//薪酬期间
//        wfzSbft.setFzrs(zrs);//总人数
//        wfzSbft.setFnscbzxrs(BigDecimal.valueOf(nscbzxrs));//合并纳税成本中心人数
//        wfzSbft.setFglf(BigDecimal.valueOf(glf));//关联方人数
//        wfzSbft.setFcreator(username);//创建者
//        wfzSbft.setFlastupdateuser(username);//最后修改者
//        wfzSbft.setFstate("SAVE");//状态
//        wfzSbft.setFsourcebillid(String.valueOf(billId));//来源单ID
//        wfzSbft.setFiseas(0L);//是否同步至eas
//
//        wfzSbft.setWfzSbftentryList(wfzSbftentries);//设置单据分录

        int i = wfzSbftService.insertWfzSbft(wfzSbft);
        return i;
    }

    @Override
    public int pushSbft(ArrayList<WfzSbjr> wfzSbjrs) {
        return 0;
    }
}
